/**********************************************************************************************************************
 * @file    weak.h
 * @author  Queclink Hubert.Lee
 * @date    2016-12-22
 * @brief   库使用到的与系统相关的接口定义, 允许用户重定义.
 * @ingroup hdl
 * Copyright (C) 2016 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 *
 * @attention
 * 1. 当系统不使用C标准库函数进行动态内存分配和释放时, 务必重定义 lib_domalloc,lib_dofree 函数;
 * 2. 当系统需要进行看门狗喂狗操作时, 务必重定义 lib_watchdog_feed 函数;
 * 3. 当系统是OS环境时, 务必重定义 lib_semaphore_xxx 函数;
 * 4. 一般情况下, 用户需要重定义 lib_delay_ms 函数.
 *
 * @usage
 *
 *********************************************************************************************************************/


#ifndef __WEAK_H
#define __WEAK_H

/* includes ---------------------------------------------------------------------------------------------------------*/
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif


extern void *lib_domalloc(size_t size, const char *file, int line, const char *func);
extern void lib_dofree(void *ptr, const char *file, int line, const char *func);

#define lib_malloc(size)    lib_domalloc(size, __FILE__, __LINE__, __FUNCTION__)
#define lib_free(ptr)       lib_dofree(ptr, __FILE__, __LINE__, __FUNCTION__)

extern void lib_watchdog_feed(void);          	/* 看门狗喂狗函数 */

/* common semaphore interface */
extern int lib_semaphore_create(void);         	/* 创建信号量, 返回 非负数:信号量ID, 负数:错误码 */
extern int lib_semaphore_obtain(int id);       	/* 获取信号量(被占用则阻塞), 返回 0:成功, others:错误码 */
extern int lib_semaphore_release(int id);      	/* 释放信号量, 返回 0:成功, others:错误码 */
extern int lib_semaphore_delete(int id);       	/* 删除信号量, 返回 0:成功, others:错误码 */

/* interrupt semaphore interface */
extern int lib_semaphore_obtain_isr(int id);   	/* 获取信号量(被占用则阻塞), 返回 0:成功, others:错误码 */
extern int lib_semaphore_release_isr(int id);  	/* 释放信号量, 返回 0:成功, others:错误码 */

extern void lib_delay_ms(unsigned int ms);   	/* 毫秒延时 */
extern void lib_delay_us(unsigned int us); 		/* 微秒延时 */	


#ifdef __cplusplus
}
#endif

#endif /* __WEAK_H */